package com.seres.util;
import org.apache.commons.codec.digest.Md5Crypt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import sun.security.provider.MD5;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import static javax.swing.text.html.parser.DTDConstants.MD;

/**
 * @Description : 生成随机数
 * @ClassName : RandomUtil
 * @Author : 扶滨
 * @Date: 2021-03-09 09:38
 */
@Component
public class RandomUtil {
    public static final String ALLCHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static final String LETTERCHAR = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static final String NUMBERCHAR = "0123456789";
    private static final String REGEX="[\n`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。， 、？]";
    private static final String ZM="[IiOo10]";
    /**
     * 返回一个定长的随机字符串(数字)
     *
     * @param length
     *            随机字符串长度
     * @return 随机字符串
     */
    public static String generateOnlyNumber(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(NUMBERCHAR.charAt(random.nextInt(NUMBERCHAR.length())));
        }
        return sb.toString();
    }


    /**
     * 返回一个定长的随机字符串(只包含大小写字母、数字)
     *
     * @param length
     *            随机字符串长度
     * @return 随机字符串
     */
    public static String generateString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(ALLCHAR.charAt(random.nextInt(ALLCHAR.length())));
        }
        return sb.toString();
    }

    /**
     * 返回一个定长的随机纯字母字符串(只包含大小写字母)
     *
     * @param length
     *            随机字符串长度
     * @return 随机字符串
     */
    public static String generateMixString(int length) {
        StringBuffer sb = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            sb.append(LETTERCHAR.charAt(random.nextInt(LETTERCHAR.length())));
        }
        return sb.toString();
    }

    /**
     * 返回一个定长的随机纯大写字母字符串(只包含大小写字母)
     *
     * @param length
     *            随机字符串长度
     * @return 随机字符串
     */
    public static String generateLowerString(int length) {
        return generateMixString(length).toLowerCase();
    }

    /**
     * 返回一个定长的随机纯小写字母字符串(只包含大小写字母)
     *
     * @param length
     *            随机字符串长度
     * @return 随机字符串
     */
    public static String generateUpperString(int length) {
        return generateMixString(length).toUpperCase();
    }

    /**
     * 生成一个定长的纯0字符串
     *
     * @param length
     *            字符串长度
     * @return 纯0字符串
     */
    public static String generateZeroString(int length) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            sb.append('0');
        }
        return sb.toString();
    }

    /**
     * 根据数字生成一个定长的字符串，长度不够前面补0
     *
     * @param num
     *            数字
     * @param fixdlenth
     *            字符串长度
     * @return 定长的字符串
     */
    public static String toFixdLengthString(long num, int fixdlenth) {
        StringBuffer sb = new StringBuffer();
        String strNum = String.valueOf(num);
        if (fixdlenth - strNum.length() >= 0) {
            sb.append(generateZeroString(fixdlenth - strNum.length()));
        } else {
            throw new RuntimeException("将数字" + num + "转化为长度为" + fixdlenth
                    + "的字符串发生异常！");
        }
        sb.append(strNum);
        return sb.toString();
    }

    /**
     * 每次生成的len位数都不相同
     *
     * @param param
     * @return 定长的数字
     */
    public static int getNotSimple(int[] param, int len) {
        Random rand = new Random();
        for (int i = param.length; i > 1; i--) {
            int index = rand.nextInt(i);
            int tmp = param[index];
            param[index] = param[i - 1];
            param[i - 1] = tmp;
        }
        int result = 0;
        for (int i = 0; i < len; i++) {
            result = result * 10 + param[i];
        }
        return result;
    }
    /**
     * @description 获取优惠券兑换码
     * @author 扶滨
     * @Date 2021/3/9 上午10:29
     * @return: java.lang.String
     */
    public String getCouponNumber(){
        String str = Md5Crypt.apr1Crypt(generateString(32)+DateUtil.format(DateUtil.date(),"yyyyMMddHHmmss"));
        String aa = "";
        String newString = str.replaceAll(REGEX,aa);
        newString = newString.replaceAll(ZM,aa);
        String substring = newString.substring(2, 10);
        StringBuilder sb=new StringBuilder(substring);
        sb.insert(2,"t");
        sb.insert(5,"x");
        sb.insert(7,"c");
        sb.insert(9,"f");
        return sb.toString().toUpperCase();
    }
    /**
     * @description 优惠码验证
     * @param number:
     * @author 扶滨
     * @Date 2021/3/9 上午10:42
     * @return: boolean
     */
    public boolean validateCoupon(String number){
        if (StringUtils.isBlank(number) || number.length()!=12){
            return false;
        }
        String t = number.substring(2, 3);
        String x = number.substring(5, 6);
        String c = number.substring(7, 8);
        String f = number.substring(9, 10);
        if (t.equals("T") && x.equals("X") && c.equals("C") && f.equals("F")){
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        String str = Md5Crypt.apr1Crypt(generateString(32)+DateUtil.format(DateUtil.date(),"yyyyMMddHHmmss"));
        String aa = "";
        String newString = str.replaceAll(REGEX,aa);
        newString = newString.replaceAll(ZM,aa);
        String substring = newString.substring(2, 10);
        StringBuilder sb=new StringBuilder(substring);
        sb.insert(2,"t");
        sb.insert(5,"x");
        sb.insert(7,"c");
        sb.insert(9,"f");
        System.out.println("返回一个定长的随机字符串(只包含大小写字母、数字)1=:" +  sb.toString().toUpperCase());
    }
}
